package editorsvg.editor.herramientas;

import editorsvg.editor.formas.NodoTrayecto;
import editorsvg.editor.formas.NodoTrayecto.TipoNodo;
import editorsvg.editor.formas.Trayecto;
import java.awt.geom.Point2D;

/**
 * Ayudante para la creación de trayectos
 * @author Jorge Berjano
 */
public class AyudanteCreacionTrayecto {

    private Trayecto trayecto;
    private NodoTrayecto nodoInicial;
    private NodoTrayecto nodoActual;
    private NodoTrayecto nodoSiguiente;

    public AyudanteCreacionTrayecto() {
        this.trayecto = new Trayecto();
    }

    public Trayecto getTrayecto() {
        return trayecto;
    }

    public void iniciar(Point2D posicion) {

        nodoInicial = new NodoTrayecto(TipoNodo.MOVER, posicion, null, null);
        trayecto.agregar(nodoInicial);
        System.out.println("iniciar");
        nodoActual = nodoInicial;
        prepararSiguiente(posicion);
    }

    public void agregarNodo(Point2D posicion) {
        if (nodoSiguiente != null) {
            nodoSiguiente.setPosicion(posicion);
            trayecto.actualizarPath();
        }
        System.out.println("agregar");
        nodoActual = nodoSiguiente;
        prepararSiguiente(posicion);
    }

    public void prepararSiguiente(Point2D posicion) {

        nodoSiguiente = new NodoTrayecto(TipoNodo.CURVA_CUBICA, posicion, null, null);

        trayecto.agregar(nodoSiguiente);
    }

    public void actualizarPosicion(Point2D posicion) {
        if (nodoSiguiente != null) {
            nodoSiguiente.setPosicion(posicion);
            siguientePosicionControl2(posicion);
            trayecto.actualizarPath();
        }
    }
    
    public void actualizarPosicionControl(Point2D posicion) {
        
        
        if (nodoActual == nodoInicial) {
            siguientePosicionControl1(posicion);
        } else {
            siguientePosicionControl1(posicion);
            actualPosicionControl2Simetrica();
            trayecto.actualizarPath();
        }
    }

    private void siguientePosicionControl1(Point2D posicion) {
        if (nodoSiguiente != null) {
            nodoSiguiente.setTipo(TipoNodo.CURVA_CUBICA);
            nodoSiguiente.setPosicionControl1(posicion);
            trayecto.actualizarPath();
        }
    }
    
    private void siguientePosicionControl2(Point2D posicion) {
        if (nodoSiguiente != null) {
            nodoSiguiente.setPosicionControl2(posicion);
            trayecto.actualizarPath();
        }
    }

    private void actualPosicionControl2Simetrica() {
        Point2D posicionControl2 = nodoSiguiente.getSimetricaPosicionControl1();
        
        nodoActual.setPosicionControl2(posicionControl2);
    }

    public void cerrar() {
        //nodos.remove(nodoSiguiente);
        if (nodoSiguiente != null) {
            nodoSiguiente.setTipo(TipoNodo.CERRAR);
            trayecto.actualizarPath();
            trayecto.generarDatos();
        }

    }
}
